#pragma once

#if defined __cplusplus
#if defined( _MSC_VER ) // Visual C++

#undef  VEX_HAS_CPP_11_FEATURE_SET_1
#undef  VEX_HAS_CPP_11_FEATURE_SET_2
#undef  VEX_HAS_CPP_11_FEATURE_SET_3

#if _MSC_VER >= 1600
// <summary>
// Fundamental C++11 support = rvalue references, decltype, std::move, std::forward (v100)
// </summary>
#define VEX_HAS_CPP_11_FEATURE_SET_1
#else
#error Fundamental C++11 support required = rvalue references, decltype, std::move, std::forward
#endif

#if _MSC_VER >= 1700
// <summary>
// C++11 support with complete STL but without variadics and default function template arguments (v110)
// </summary>
#define VEX_HAS_CPP_11_FEATURE_SET_2
#endif

#if _MSC_VER >= 1800
// <summary>
// C++11 support with complete STL, with variadics and default function template arguments (v120)
// </summary>
#define VEX_HAS_CPP_11_FEATURE_SET_3
#endif

#else // Other toolsets (currently just assuming full C++11 conformance)

#define VEX_HAS_CPP_11_FEATURE_SET_1
#define VEX_HAS_CPP_11_FEATURE_SET_2
#define VEX_HAS_CPP_11_FEATURE_SET_3

#endif

#ifdef VEX_HAS_CPP_11_FEATURE_SET_3
#define VEX_DEFAULTED_DESTRUCTOR(VexClass) \
    ~##VexClass##() = default;

#define VEX_NON_COPYABLE(VexClass) \
    VexClass(VexClass const&) = delete; \
    VexClass& operator = (VexClass const&) = delete;
#else
#define VEX_NON_COPYABLE(VexClass) \
    VexClass(VexClass const&); \
    VexClass& operator = (VexClass const&);

#define VEX_DEFAULTED_DESTRUCTOR(VexClass) \
    ~##VexClass##() {}
#endif

#endif // _cplusplus